winsafe\dxgi\com_interfaces/
idxgiswapchain.rs1#![allow(non_camel_case_types, non_snake_case)]
2
3use crate::co;
4use crate::decl::*;
5use crate::dxgi::vts::*;
6use crate::kernel::privs::*;
7use crate::ole::privs::*;
8use crate::prelude::*;
9
10com_interface! { IDXGISwapChain: "310d36a0-d2e7-4c0a-aa04-6a9d23b8886a";
11 }
18
19impl dxgi_IDXGIObject for IDXGISwapChain {}
20impl dxgi_IDXGIDeviceSubObject for IDXGISwapChain {}
21impl dxgi_IDXGISwapChain for IDXGISwapChain {}
22
23pub trait dxgi_IDXGISwapChain: dxgi_IDXGIDeviceSubObject {
32 #[must_use]
35 fn GetBuffer<T>(&self, buffer_index: u32) -> HrResult<T>
36 where
37 T: ole_IUnknown,
38 {
39 let mut queried = unsafe { T::null() };
40 ok_to_hrresult(unsafe {
41 (vt::<IDXGISwapChainVT>(self).GetBuffer)(
42 self.ptr(),
43 buffer_index,
44 pcvoid(&T::IID),
45 queried.as_mut(),
46 )
47 })
48 .map(|_| queried)
49 }
50
51 fn_com_interface_get! { GetContainingOutput: IDXGISwapChainVT => IDXGIOutput;
52 }
55
56 #[must_use]
59 fn GetDesc(&self) -> HrResult<DXGI_SWAP_CHAIN_DESC> {
60 let mut desc = DXGI_SWAP_CHAIN_DESC::default();
61 ok_to_hrresult(unsafe {
62 (vt::<IDXGISwapChainVT>(self).GetDesc)(self.ptr(), pvoid(&mut desc))
63 })
64 .map(|_| desc)
65 }
66
67 fn GetFrameStatistics(&self) -> HrResult<DXGI_FRAME_STATISTICS> {
70 let mut stats = DXGI_FRAME_STATISTICS::default();
71 ok_to_hrresult(unsafe {
72 (vt::<IDXGISwapChainVT>(self).GetDesc)(self.ptr(), pvoid(&mut stats))
73 })
74 .map(|_| stats)
75 }
76
77 #[must_use]
80 fn GetFullscreenState(&self) -> HrResult<(bool, Option<IDXGIOutput>)> {
81 let mut fullscreen = 0;
82 let mut queried = unsafe { IDXGIOutput::null() };
83
84 ok_to_hrresult(unsafe {
85 (vt::<IDXGISwapChainVT>(self).GetFullscreenState)(
86 self.ptr(),
87 &mut fullscreen,
88 queried.as_mut(),
89 )
90 })
91 .map(|_| (fullscreen != 0, if queried.ptr().is_null() { None } else { Some(queried) }))
92 }
93
94 #[must_use]
97 fn GetLastPresentCount(&self) -> HrResult<u32> {
98 let mut count = 0u32;
99 ok_to_hrresult(unsafe {
100 (vt::<IDXGISwapChainVT>(self).GetLastPresentCount)(self.ptr(), &mut count)
101 })
102 .map(|_| count)
103 }
104
105 fn Present(&self, sync_interval: u32, flags: co::DXGI_PRESENT) -> HrResult<()> {
108 ok_to_hrresult(unsafe {
109 (vt::<IDXGISwapChainVT>(self).Present)(self.ptr(), sync_interval, flags.raw())
110 })
111 }
112
113 fn ResizeBuffers(
116 &self,
117 buffer_count: u32,
118 width: u32,
119 height: u32,
120 new_format: co::DXGI_FORMAT,
121 swap_chain_flags: co::DXGI_SWAP_CHAIN_FLAG,
122 ) -> HrResult<()> {
123 ok_to_hrresult(unsafe {
124 (vt::<IDXGISwapChainVT>(self).ResizeBuffers)(
125 self.ptr(),
126 buffer_count,
127 width,
128 height,
129 new_format.raw(),
130 swap_chain_flags.raw(),
131 )
132 })
133 }
134
135 fn ResizeTarget(&self, new_target_parameters: &DXGI_MODE_DESC) -> HrResult<()> {
138 ok_to_hrresult(unsafe {
139 (vt::<IDXGISwapChainVT>(self).ResizeTarget)(self.ptr(), pcvoid(new_target_parameters))
140 })
141 }
142
143 fn SetFullscreenState(
146 &self,
147 fullscreen: bool,
148 target: Option<&impl dxgi_IDXGIOutput>,
149 ) -> HrResult<()> {
150 ok_to_hrresult(unsafe {
151 (vt::<IDXGISwapChainVT>(self).SetFullscreenState)(
152 self.ptr(),
153 fullscreen as _,
154 target.map_or(std::ptr::null_mut(), |t| t.ptr()),
155 )
156 })
157 }
158}